package main

import (
	"fmt"
	"sync"
	"time"
)

// 计算1-200的各个数的阶乘，并将结果放入map中，最后在主线程输出。
// 使用协程来实现，效率高，但是会出现并发安全问题。
// 存在协程间通信问题。

var result map[int64]int64
var lock sync.Mutex

func Test(n int64) int64 {
	var result int64 = 1

	var i int64 = 1
	for ; i <= n; i++ {
		result *= i
	}

	return result
}

func test(n int64) {
	i := Test(n)
	lock.Lock()
	defer lock.Unlock()
	result[n] = i
}

func main() {

	result = make(map[int64]int64, 200)

	var i int64 = 1
	for ; i <= 200; i++ {
		go test(i)
	}

	time.Sleep(time.Second * 10)

	lock.Lock()
	defer lock.Unlock()

	for k, v := range result {
		fmt.Printf("%d: %d\n", k, v)
	}
}
